import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
file_path_clear='../../data/cleared data/'
file_path_image='../../data/image/'
# 1. 准备数据：读取清洗后的餐饮连锁品牌数据，替换为你的数据文件路径
df = pd.read_excel(file_path_clear+'餐饮连锁品牌数据_cleaned.xlsx')  # 此处已替换为目标数据文件名
store_ids = df['门店ID'].values  # 门店ID（X轴类别）
sales_volume = df['销售数量'].values  # 同款核心菜品销量（第一组Y轴数据）
gross_margin = df['毛利率(%)'].values  # 毛利率（第二组Y轴数据，需做数值缩放以适配图表）

# 毛利率数值较小（73%-75%），与销量（480-1140）量级差异大，缩放后用于图表展示（不影响实际含义）
gross_margin_scaled = gross_margin * 10  # 缩放10倍，使柱状图高度匹配销量维度

# 2. 创建画布：保持原代码的画布尺寸与分辨率设置
plt.figure(figsize=(14, 8), dpi=100)  # 适当加宽画布以容纳30个门店的X轴标签

# 3. 绘制分组柱状图：替换原直方图代码，改为双组柱状图（销量+缩放后毛利率）
bar_width = 0.35  # 柱子宽度
x = np.arange(len(store_ids))  # X轴位置坐标

# 绘制“同款核心菜品销量”柱状图
bars1 = plt.bar(
    x - bar_width/2,  # 第一组柱子位置（左移半宽）
    sales_volume,
    width=bar_width,
    color='skyblue',
    alpha=0.8,
    edgecolor='black',
    linewidth=0.5,
    label='同款核心菜品销量(份)'  # 图例标签，对应需求中的数据维度
)

# 绘制“缩放后毛利率”柱状图（标注实际毛利率数值）
bars2 = plt.bar(
    x + bar_width/2,  # 第二组柱子位置（右移半宽）
    gross_margin_scaled,
    width=bar_width,
    color='lightcoral',
    alpha=0.8,
    edgecolor='black',
    linewidth=0.5,
    label=f'毛利率(%)（已缩放10倍）'  # 标注缩放说明，避免误解
)

# 4. 补充统计信息与标注：保留原代码的均值/标准差逻辑，适配两组数据
# 销量的均值与标准差（用于辅助分析门店销量差异）
mu_sales, sigma_sales = np.mean(sales_volume), np.std(sales_volume)
# 毛利率的均值与标准差（基于原始未缩放数据）
mu_margin, sigma_margin = np.mean(gross_margin), np.std(gross_margin)

# 在图表顶部添加统计信息文本框（不影响柱状图主体）
stats_text = f'销量统计：均值={mu_sales:.1f}份，标准差={sigma_sales:.1f}\n毛利率统计：均值={mu_margin:.2f}%，标准差={sigma_margin:.2f}%'
plt.text(0.02, 0.98, stats_text, transform=plt.gca().transAxes,
         fontsize=10, verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))

# 5. 图表美化与标签：解决中文乱码，补充需求相关的标题与轴标签
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']  # 中文用SimHei，英文用DejaVu Sans，避免乱码
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示异常问题

# 标题与轴标签：严格对应“分析门店销量与毛利率差异”的需求
plt.title('餐饮连锁品牌各门店同款核心菜品销量与毛利率对比图', fontsize=16, fontweight='bold')
plt.xlabel('门店ID', fontsize=12)
plt.ylabel('数值（销量：份；毛利率：%×10）', fontsize=12)  # 明确标注Y轴含义与缩放关系

# X轴标签：旋转45度避免重叠，适配30个门店的密集标签
plt.xticks(x, store_ids, rotation=45, ha='right')  # ha='right'使标签右对齐，更易读

# 图例：保留原代码的图例逻辑，展示两组数据的区分
plt.legend(fontsize=10)

# 网格线：仅保留Y轴网格，与原代码一致，提升可读性
plt.grid(axis='y', linestyle=':', alpha=0.7)

# 6. 添加数值标签：在每个柱子顶部标注实际数值（关键需求：直观查看差异）
# 销量柱子标注（原始数值，保留1位小数）
for bar in bars1:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height + 10,
             f'{height:.1f}', ha='center', va='bottom', fontsize=8)

# 毛利率柱子标注（原始未缩放数值，保留2位小数，明确“%”单位）
for bar, actual_margin in zip(bars2, gross_margin):
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height + 10,
             f'{actual_margin:.2f}%', ha='center', va='bottom', fontsize=8)

# 保持原代码的布局调整与展示逻辑
plt.tight_layout()  # 自动调整布局，避免标签被截断
plt.savefig(file_path_image+'直方图.png', dpi=150, bbox_inches='tight')# 保存图片
plt.show()